package com.niit.activity.controller;

import com.niit.activity.QiniuUtil;
import com.niit.activity.entity.Activity;
import com.niit.activity.entity.Topic;
import com.niit.activity.service.ActivityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/activity")
@CrossOrigin(origins = "http://localhost:5173")
public class ActivityController {
    @Autowired
    private ActivityService activityService;

    @Autowired
    private QiniuUtil qiniuUtil;


        /**
     * 更新指定ID的动态信息。
     *
     * @param id       要更新的活动ID
     * @param activity 包含新数据的活动对象
     * @return 如果更新成功返回OK状态及成功消息；否则返回冲突状态及失败原因
     */
    @PutMapping("/{id}")
    public ResponseEntity<String> updateActivity(
            @PathVariable("id") Long id,
            @RequestBody Activity activity) {

        activity.setId(id);
        boolean success = activityService.updateActivity(activity);

        if (success) {
            return ResponseEntity.ok("Activity with ID " + id + " updated successfully");
        } else {
            return ResponseEntity.status(HttpStatus.CONFLICT)
                    .body("Update failed. Possible reasons: version mismatch or record not found");
        }
    }

    /**
     * 根据ID获取单个动态详情。
     *
     * @param id 活动ID
     * @return 如果找到对应活动则返回该活动对象；否则返回404 Not Found
     */
    @GetMapping("/{id}")
    public ResponseEntity<Activity> getActivityById(@PathVariable("id") Long id) {
        Activity activity = activityService.getActivityById(id);
        if (activity != null) {
            return ResponseEntity.ok(activity);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    /**
     * 添加一个新的动态。
     *
     * @param activity 待添加的活动对象
     * @return 成功时返回提示信息字符串
     */
    @PostMapping
    public String addActivity(@RequestBody Activity activity) {
        // 验证用户是否已登录且ID有效
        if (activity.getUserId() == null || activity.getUserId() <= 0) {
            return "用户未登录或用户ID无效，无法发布动态";
        }
        activityService.insertActivity(activity);
        return "Activity added successfully";
    }

    /**
     * 获取所有公开可见的动态列表。
     *
     * @return 公开动态列表
     */
    @GetMapping("/public")
    public List<Activity> getPublicActivity() {
        return activityService.findPublicActivity();
    }

    /**
     * 根据活动ID查询其关联的动态信息。
     *
     * @param activityId 动态ID
     * @return 关联话题对象
     */
    @GetMapping("/{activityId}/topic")
    public Topic getTopicByActivityId(@PathVariable Long activityId) {
        return activityService.getTopicByActivityId(activityId);
    }

    /**
     * 根据动态ID查询其关联话题的内容文本。
     *
     * @param activityId 动态ID
     * @return 话题内容字符串
     */
    @GetMapping("/{activityId}/topic/content")
    public String getTopicContentByActivityId(@PathVariable Long activityId) {
        return activityService.getTopicContentByActivityId(activityId);
    }

    /**
     * 删除指定ID的动态。
     *
     * @param id 要删除的动态ID
     * @return 删除成功的提示信息
     */
    @DeleteMapping("/{id}")
    public String deleteActivity(@PathVariable("id") Long id) {
        activityService.deleteActivityById(id);
        return "Activity with ID " + id + " deleted successfully";
    }

    /**
     * 切换用户对某活动的动态状态（点赞/取消点赞）。
     *
     * @param id     动态ID
     * @param userId 用户ID
     * @return 响应结果，包括操作是否成功、当前点赞状态以及相关提示信息
     */
    // 点赞接口
    @PostMapping("/{id}/toggle-like")
    public ResponseEntity<Map<String, Object>> toggleLikeActivity(
            @PathVariable("id") Long id,
            @RequestParam(value = "userId") Long userId) {

        Map<String, Object> response = new HashMap<>();

        try {
            // 参数校验：确保用户ID合法
            if (userId == null || userId <= 0) {
                response.put("success", false);
                response.put("message", "用户未登录或用户ID无效，无法点赞");
                return ResponseEntity.badRequest().body(response);
            }

            boolean isLiked = activityService.toggleLikeActivity(id, userId);

            response.put("success", true);
            response.put("liked", isLiked);
            response.put("message", isLiked ? "点赞成功" : "取消点赞成功");

            return ResponseEntity.ok(response);
        } catch (Exception e) {
            response.put("success", false);
            response.put("message", "操作失败: " + e.getMessage());
            log.error("点赞操作异常", e); // 添加日志记录
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
        }
    }

    /**
     * 查询用户是否已经点赞了某个动态。
     *
     * @param id     动态ID
     * @param userId 用户ID
     * @return 当前用户的点赞状态
     */
    // 查询用户是否点赞了某个动态
    @GetMapping("/{id}/is-liked")
    public ResponseEntity<Map<String, Object>> isUserLiked(
            @PathVariable("id") Long id,
            @RequestParam(value = "userId") Long userId) {

        Map<String, Object> response = new HashMap<>();
        boolean isLiked = activityService.isUserLikedActivity(id, userId);
        response.put("liked", isLiked);
        return ResponseEntity.ok(response);
    }

    /**
     * 根据用户ID获取其发布的所有动态。
     *
     * @param userId 动态ID
     * @return 该用户的所有活动列表，若用户ID非法则返回空列表
     */
    @GetMapping("/user/{userId}")
    public List<Activity> getActivitiesByUserId(@PathVariable Long userId) {
        if (userId == null || userId <= 0) {
            return List.of(); // 返回空列表，或可自定义错误响应
        }
        return activityService.getActivitiesByUserId(userId);
    }

    /**
     * 文件上传接口，将文件上传至七牛云并返回访问链接。
     *
     * @param file 要上传的文件
     * @return 若上传成功返回外链URL；否则返回“上传失败”提示
     */
    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) {
        try {
            String url = qiniuUtil.uploadFile(file.getInputStream(), file.getOriginalFilename());
            return url; // 返回七牛云的外链
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败";
        }
    }

}